package com.weai.service.impl;

import com.weai.config.DeepSeekConfig;
import com.weai.dto.DepositAIChatRequest;
import com.weai.dto.DepositAIChatResponse;
import com.weai.entity.Task;
import com.weai.repository.TaskRepository;
import com.weai.service.DepositAIService;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

/**
 * AI助手服务实现类
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class DepositAIServiceImpl implements DepositAIService {

    /**
     * DeepSeek聊天模型
     */
    private final ChatLanguageModel chatModel;
    
    /**
     * DeepSeek配置
     */
    private final DeepSeekConfig deepSeekConfig;

    private final TaskRepository taskRepository;
    
    /**
     * 会话内存缓存，键为会话ID，值为聊天记忆对象
     */
    private final Map<String, ChatMemory> chatMemories = new ConcurrentHashMap<>();
    
    /**
     * AI助手的系统提示信息
     */

    private static final String SYSTEM_PROMPT = "你是一个功能强大的AI助手，基于DeepSeek大模型。你可以回答各种问题、提供信息、创意建议和帮助。请尽可能提供全面、准确、有用的回答 ";

    private static final String GET_PROBLEM_TYEP_PROMPT = """ 
            你是一个专业的系统管理员，负责分析用户输入并判断其意图类型。系统支持两种主要功能：
            1. 任务/需求管理
            2. 通用AI对话

            请分析用户输入并返回对应的类型代码：
            - 1: 表示用户想要创建新的任务或需求
            - 2: 表示用户想要进行普通对话

            要求：
            - 仅返回数字1或2
            - 不要包含任何其他文字或解释
            - 基于用户输入的关键词和上下文进行判断

            示例：
            输入：帮我创建一个新任务
            输出：1

            输入：今天天气怎么样
            输出：2
            """;
    private static final String GEN_PARAMS_PROMPT = """
            你是一个专业的语义分析专家，擅长从用户输入中提取核心任务信息。请遵循以下规则：

            1. 去除所有请求性前缀（如"帮我"、"请"、"需要"等）
            2. 去除所有任务相关后缀（如"提一下任务"、"建立需求"等）
            3. 保留原始任务描述的核心内容
            4. 直接返回提取结果，无需任何解释

            示例：
            用户输入：帮我建立一个需求，需求内容是：chaiBI调研
            提取结果：chaiBI调研

            用户输入：RPT录视频并上传，后续指导业务操作;给我提一下任务
            提取结果：RPT录视频并上传，后续指导业务操作

            用户输入：备忘一下，测试需求完成poc
            提取结果：测试需求完成poc
            
            
            """;




    ///**
    // * 获取或创建聊天记忆
    // *
    // * @param conversationId 会话ID
    // * @return 聊天记忆对象
    // */
    //private ChatMemory getChatMemory(String conversationId) {
    @Override
    public DepositAIChatResponse chat(DepositAIChatRequest request, String username) {
        try {

            //通过提示词判断用户的问题类型
            String userMessage = request.getMessage();
            String prompt = GET_PROBLEM_TYEP_PROMPT + "\n\n" + "输入：" + userMessage + "\n" + "输出：";
            String response = chatModel.generate(prompt);
            int problemType = Integer.parseInt(response);
            log.info("用户的问题类型：{}", problemType);
            if (problemType == 1) {
                // 提取出的关键信息
                String genParams = GEN_PARAMS_PROMPT + "\n\n" + "用户输入：" + userMessage + "\n" + "提取结果：";
                String genParamsResponse = chatModel.generate(genParams);
                log.info("提取出的关键信息：{}", genParamsResponse);
                Task task = new Task();

                // 设置当前周的周一和周日日期
                LocalDate now = LocalDate.now();
                LocalDate startOfWeek = now.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
                LocalDate endOfWeek = now.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));

                // 生成标题索引：当前时间(年月日时分)+创建者
                String titleIndex = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmm")) + "_AI";
                task.setTitleIndex(titleIndex);
                task.setTitle(genParamsResponse);
                task.setCreater(username);
                task.setPeriodStartDate(startOfWeek);
                task.setPeriodEndDate(endOfWeek);
                task.setStatus("todo");
                task.setCreatedTime(LocalDateTime.now());
                task.setUpdateTime(LocalDateTime.now());
                task.setType("暂无分类");
                task.setSubType("暂无子分类");
                task.setLevel("暂无");


                Task savedTask = taskRepository.save(task);
                log.info("任务创建成功, ID: {}, 需求名称: {}, 创建者: {}", savedTask.getId(), genParamsResponse, savedTask.getCreater());
                // 获取当前用户的姓名

                return DepositAIChatResponse.builder()
                       .response("任务创建成功, ID: " + savedTask.getId())
                       .conversationId("测试")
                       .timestamp(LocalDateTime.now())
                       .build();
            }


            String conversationId = request.getConversationId();
            
            // 如果会话ID为空，创建新会话
            if (StringUtils.isBlank(conversationId)) {
                conversationId = UUID.randomUUID().toString();
            }
            
            // 获取或创建聊天记忆
            ChatMemory memory = getChatMemory(conversationId);
            
            // 将用户消息添加到记忆
            memory.add(new UserMessage(request.getMessage()));
            
            // 获取所有历史消息
            List<ChatMessage> messages = new ArrayList<>();
            messages.add(new SystemMessage(SYSTEM_PROMPT));
            messages.addAll(memory.messages());

            
            // 获取AI回复
            AiMessage aiMessage = chatModel.generate(messages).content();
            
            // 将AI回复添加到记忆
            memory.add(aiMessage);
            
            // 构建响应对象
            return DepositAIChatResponse.builder()
                    .response(aiMessage.text())
                    .conversationId(conversationId)
                    .timestamp(LocalDateTime.now())
                    .build();
        } catch (Exception e) {
            log.error("与AI对话过程中发生错误", e);
            return DepositAIChatResponse.builder()
                    .response("很抱歉，AI助手暂时无法回答您的问题，请稍后再试。错误信息：" + e.getMessage())
                    .conversationId(request.getConversationId())
                    .timestamp(LocalDateTime.now())
                    .build();
        }
    }

    //企业微信AI服务助手对话请求
    @Override
    public DepositAIChatResponse weChat(String request, String username) {
        DepositAIChatRequest depositAIChatRequest = new DepositAIChatRequest(request, null, username);
        return chat(depositAIChatRequest, username);
    }

    /**
     * 获取或创建聊天记忆
     *
     * @param conversationId 会话ID
     * @return 聊天记忆对象
     */
    private ChatMemory getChatMemory(String conversationId) {
        return chatMemories.computeIfAbsent(conversationId, id -> {
            // 创建有限窗口大小的聊天记忆，只保留最近的N轮对话
            return MessageWindowChatMemory.builder()
                    .maxMessages(deepSeekConfig.getMaxHistory() * 2) // 乘以2是因为每轮对话包含用户消息和AI消息
                    .build();
        });
    }
} 